package com.tian.view.draw.shader

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.BitmapShader
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.Paint
import android.graphics.Shader
import android.util.AttributeSet
import com.tian.util.view.DisplayUtil
import com.tian.view.R
import com.tian.view.common.BaseClickView

/**
 * @author tiansongtao
 * @date 2023/1/5 16:55
 *
 * 使用bitmapShader来生成不规则头像
 *
 */
class BitmapShaderHeadView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
        BaseClickView(context, attrs, defStyleAttr) {

    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
    constructor(context: Context) : this(context, null)
    init {
        setLayerType(LAYER_TYPE_SOFTWARE, null)
    }

    private val paint = Paint()
    private val bitmap: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.head_photo)
    private val shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
    private var showRound = false


    /**
     * Shader的填充模式：当图片小于view大小时需要填充多余的空间
     *  [Shader.TileMode.MIRROR]: 重复使用镜像模式来填充多余空间
     *  [Shader.TileMode.REPEAT]: 重复原图填充多余空间
     *  [Shader.TileMode.CLAMP]: 用图像边缘彩色来填充多余空间
     * 注意：填充总是先沿Y轴填充后沿X轴填充
     *
     * 限制范围绘制，可以看到只显示了原来的部分内容，可见shader总是从
     * view的左上角开始绘制的。
     */
    override fun onDraw(canvas: Canvas) {
        val scale = width.toFloat() / bitmap.width
        val mt = Matrix()
        mt.setScale(scale, scale)
        shader.setLocalMatrix(mt)
        paint.shader = shader
        if (showRound) {
            val r = DisplayUtil.dpToPx(20f)
            canvas.drawRoundRect(0f, 0f, width.toFloat(), height.toFloat(), r, r, paint)
        } else {
            canvas.drawCircle(width / 2f, height / 2f, width / 2f, paint)
        }
    }

    override fun singleClick() {
        super.singleClick()
        showRound = !showRound
        postInvalidate()
    }
}